package com.wyix;

import com.wyix.entity.Pet;
import com.wyix.entity.User;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author wangdx
 * @since 2025/8/5
 */
public class AdoptionPlatform {
    // 场景1：可领养宠物列表（频繁随机访问，用ArrayList）
    private List<Pet> availablePets = new ArrayList<>();

    // 场景2：待审核宠物队列（频繁头尾增删，用LinkedList）
    private LinkedList<Pet> pendingPets = new LinkedList<>();

    // 场景3：用户领养记录（按用户ID快速查询，用HashMap）
    private Map<String, List<Pet>> userAdoptionRecords = new HashMap<>();

    // 场景4：按品种分类的宠物（自动按品种排序，用TreeMap）
    private TreeMap<String, List<Pet>> breedSortedPets = new TreeMap<>();

    // 场景5：宠物领养量统计（多线程安全，用ConcurrentHashMap）
    private ConcurrentHashMap<String, Integer> adoptionCount = new ConcurrentHashMap<>();

    // 1. 添加可领养宠物（ArrayList示例）
    public void addAvailablePet(Pet pet) {
        availablePets.add(pet);  // O(1)均摊时间复杂度
        updateBreedSortedMap(pet); // 同步更新品种分类
    }

    // 2. 审核宠物（LinkedList示例）
    public Pet approvePendingPet() {
        if (pendingPets.isEmpty()) return null;
        Pet approved = pendingPets.removeFirst();  // O(1)时间复杂度
        addAvailablePet(approved);
        return approved;
    }

    // 3. 记录用户领养（HashMap示例）
    public void recordAdoption(User user, Pet pet) {
        pet.setAdopted(true);
        userAdoptionRecords.computeIfAbsent(user.getUserId(), k -> new ArrayList<>()).add(pet);
        adoptionCount.merge(pet.getBreed(), 1, Integer::sum);  // 同步更新品种领养量
    }

    // 4. 按品种查询宠物（TreeMap示例）
    public List<Pet> getPetsByBreed(String breed) {
        return breedSortedPets.getOrDefault(breed, Collections.emptyList());
    }

    // 5. 获取热门品种（ConcurrentHashMap示例）
    public String getMostPopularBreed() {
        return adoptionCount.entrySet().stream()
                .max(Map.Entry.comparingByValue())
                .map(Map.Entry::getKey)
                .orElse("无统计数据");
    }

    // 辅助方法：更新品种分类TreeMap
    private void updateBreedSortedMap(Pet pet) {
        breedSortedPets.computeIfAbsent(pet.getBreed(), k -> new ArrayList<>()).add(pet);
    }

    public static void main(String[] args) {
        AdoptionPlatform platform = new AdoptionPlatform();

        // 模拟数据
        Pet cat1 = new Pet("1", "小白", "布偶猫", false);
        Pet dog1 = new Pet("2", "大黄", "金毛犬", false);
        platform.pendingPets.add(cat1);
        platform.pendingPets.add(dog1);

        // 审核宠物
        System.out.println("审核通过宠物：" + platform.approvePendingPet());  // 输出：[小白, 品种: 布偶猫, 待领养]
        System.out.println("审核通过宠物：" + platform.approvePendingPet());  // 输出：[大黄, 品种: 金毛犬, 待领养]

        // 用户领养
        User user = new User("U001", "小明");
        platform.recordAdoption(user, platform.availablePets.get(0));

        // 查询热门品种
        System.out.println("当前热门品种：" + platform.getMostPopularBreed());  // 输出：布偶猫
    }

}
